+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Content;
+using System.Security.Cryptography;
+
+namespace SuperPolarity
+{
+ class StandardShip : Ship
+ {
+
+ protected bool Flashing;
+ protected int ChangeRate;
+ protected int CurrentTime;
+ public int AngleChangeProbability;
+ protected int BouncePadding;
+ protected float RotationFactor;
+ protected Random Random;
+ protected bool AddingAngle;
+
+ public StandardShip(SuperPolarity newGame) : base(newGame) {}
+
+ public override void Initialize(Texture2D texture, Vector2 position)
+ {
+ base.Initialize(texture, position);
+
+ var cryptoResult = new byte[4];
+ new RNGCryptoServiceProvider().GetBytes(cryptoResult);
+
+ ChangeRate = 50;
+ AngleChangeProbability = 50;
+ BouncePadding = 0;
+ MaxVelocity = 2;
+ CurrentTime = 0;
+ RotationFactor = (float) (3 * Math.PI / 180);
+ Random = new Random(BitConverter.ToInt32(cryptoResult, 0));
+ AddingAngle = true;
+ }
+
+ public override void Magnetize(Ship ship, float distance, float angle)
+ {
+ if (ship.GetType() == typeof(MainShip)) {
+ base.Magnetize(ship, distance, angle);
+ }
+ }
+
+ public override void Update(GameTime gameTime)
+ {
+ CurrentTime += gameTime.ElapsedGameTime.Milliseconds;
+ if (!Magnetizing)
+ {
+ AutoMove();
+ BounceBack();
+ }
+ ChangeAngle();
+ Position += Velocity;
+ UpdateBox();
+ Magnetizing = false;
+
+ if (Flashing)
+ {
+ Color = new Color(255, 255, 255, 128);
+ Flashing = false;
+ }
+ else
+ {
+ Color = Color.White;
+ }
+ }
+
+ protected void AutoMove()
+ {
+ float newAngle = Angle;
+
+ if (CurrentTime < ChangeRate)
+ {
+ return;
+ }
+
+ if (Random.Next(AngleChangeProbability) == 2)
+ {
+ AddingAngle = !AddingAngle;
+ }
+
+ CurrentTime = 0;
+
+ if (AddingAngle)
+ {
+ newAngle += (float) ( Random.NextDouble() * RotationFactor);
+ }
+ else
+ {
+ newAngle -= (float) (Random.NextDouble() * RotationFactor);
+ }
+
+ Velocity.X = (float) (MaxVelocity * Math.Cos(newAngle));
+ Velocity.Y = (float) (MaxVelocity * Math.Sin(newAngle));
+ }
+
+ protected void BounceBack()
+ {
+ if (Position.X + Width < -BouncePadding && Velocity.X < 0)
+ {
+ Velocity.X = -Velocity.X;
+ }
+
+ if (Position.Y + Height < -BouncePadding && Velocity.Y < 0)
+ {
+ Velocity.Y = -Velocity.Y;
+ }
+
+ if (Position.X > game.GraphicsDevice.Viewport.Width + BouncePadding && Velocity.X > 0)
+ {
+ Velocity.X = -Velocity.X;
+ }
+
+ if (Position.Y > game.GraphicsDevice.Viewport.Height + BouncePadding && Velocity.Y > 0)
+ {
+ Velocity.Y = -Velocity.Y;
+ }
+ }
+
+ public override void Collide(Actor other, Rectangle collision)
+ {
+ if (Dying)
+ {
+ return;
+ }
+
+ if (other.GetType() == typeof(MainShip))
+ {
+ Die();
+ return;
+ }
+
+ if (other.GetType() == typeof(Bullet))
+ {
+ var theBullet = (Bullet)other;
+ TakeDamage(theBullet.Power);
+ Flashing = true;
+ }
+ }
+
+ protected override void Die()
+ {
+ ActorManager.CheckOut(this);
+ Renderer.CheckOut(this);
+ game.Player.AddScore(Value);
+ game.Player.AddMultiplier(1);
+ }
+ }
+}